// deepseek界面的类声明头文件
#include "deepseekwindow.h"

// deepseek的UI界面头文件
#include "ui_deepseekwindow.h"

// 网络JSON数据解析头文件
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

// 网络响应的包体头文件
#include <QNetworkReply>

// 网络的url统一资源定位符（host+head+网页地址）
#include <QUrlQuery>

// deepseek的UI界面类创建对象的构造函数
DeepSeekWindow::DeepSeekWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::DeepSeekWindow)
{
    // 设置并显示deepseek的UI界面
    ui->setupUi(this);

    // 设置窗口属性：关闭时自动销毁
    setAttribute(Qt::WA_DeleteOnClose);

    // 在创建deepseek的UI界面的同时，创建一个历史对话存储JSON数组数据的对象，用于存储用户和deepseek服务器的聊天记录
    conversationHistory =  new QJsonArray;
}

// deepseek的UI界面类对象释放堆空间资源的析构函数
DeepSeekWindow::~DeepSeekWindow()
{
    // 释放deepseek的UI界面对象的堆空间资源
    delete ui;
}

// 重写关闭事件
void DeepSeekWindow::closeEvent(QCloseEvent *event)
{
    QWidget *parent = parentWidget();  // 获取父窗口
    if (parent) {
        parent->show();  // 显示父窗口
    }
    event->accept();     // 接受关闭事件（窗口会正常关闭）
}

// 发送问题的发送按钮槽函数
void DeepSeekWindow::on_SendBtn_clicked()
{

//    QUrl url (ui->UrlEdit->text());
    QUrl url ("https://api.deepseek.com/chat/completions"); // deepseek服务器的请求地址：https://api.deepseek.com/chat/completions

    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader , "application/json");
//    request.setRawHeader("Authorization", QString("Bearer %1").arg(ui->SKEdit->text()).toUtf8());
    request.setRawHeader("Authorization", QString("Bearer %1").arg("sk-6bedbc75515b42929a37fff8ea9ded3d").toUtf8()); // deepseek服务器的API-KEY：sk-6bedbc75515b42929a37fff8ea9ded3d

    qDebug() << request.url() ;

    // 请求体
    QJsonObject json;
    json["model"] = "deepseek-chat";

    QJsonArray messages;
    QJsonObject systemMessage;
    systemMessage["role"] = "system";
    systemMessage["content"] = "你是一个专业的机器人";
    messages.append(systemMessage);

    // 添加上下文消息
    for (const auto& msg : *conversationHistory) {
        messages.append(msg);
    }


    QJsonObject userMessage;
    userMessage["role"] = "user";
    userMessage["content"] = ui->SendEdit->text();
    messages.append(userMessage);

    json["messages"] = messages;
    json["stream"] = false;

    QJsonDocument doc(json);
    QByteArray data = doc.toJson();


    manager = new QNetworkAccessManager();
    manager->post(request ,  data );

    // 连接信号与槽
    connect(manager , &QNetworkAccessManager::finished , this , &DeepSeekWindow::RecvData);

    ui->statusbar->showMessage("DeepSeek 思考中....");
}

// 接收服务器响应用户提问的问题后下发信息数据的槽函数
void DeepSeekWindow::RecvData(QNetworkReply *reply)
{
#if 0
    while (reply->canReadLine()) {
        QByteArray line = reply->readLine().trimmed();
        qDebug() << line ;
    }
#else

    ui->statusbar->showMessage("DeepSeek思考结束...");
    if(reply->error() == QNetworkReply::NoError)
    {
        QString data = QString::fromUtf8(reply->readAll());
        qDebug() << data ;

        // 如果需要解析JSON响应
        QJsonObject jsonObject = QJsonDocument::fromJson(data.toUtf8()).object();
        QJsonArray arr = jsonObject.value("choices").toArray();
//        qDebug() << arr ;
        QJsonObject msgArr = arr[0].toObject();
        QString msg = msgArr.value("message").toObject().value("content").toString();
//        qDebug() << msg ;
        ui->textEdit->append(msg);


        // 将助手回复添加到上下文
        QJsonObject assistantMessage;
        assistantMessage["role"] = "assistant";
        assistantMessage["content"] = msg;
        conversationHistory->append(assistantMessage);

        // 将用户消息添加到上下文
        QJsonObject userMessageObj;
        userMessageObj["role"] = "user";
        userMessageObj["content"] = ui->SendEdit->text();
        conversationHistory->append(userMessageObj);

    }
    else{
        qDebug() << "Error:" << reply->errorString();
    }
#endif
}
